//
// Copyright (c) 2024 BPer
//

#include <bperrtp/BPerRtcpPli.h>
#include <bperrtp/BPerRtpConstant.h>

#include <bperutil/sys/BPerLog.h>

void bPer_create_rtcpPli(BPerRtcpCommon* comm){
	if(comm==NULL) return;
	comm->header.padding = 0;
	comm->header.type = BPerRtcpType_psfb;
	comm->header.rc = kPLI;
	comm->header.version = kRtcpVersion;
	comm->ssrc = 0;
}
void bPer_destroy_rtcpPli(BPerRtcpCommon* comm){

}
int32_t bPer_encode_rtcpPli(BPerRtcpCommon* comm,BPerBuffer* buffer){
	if(comm==NULL) return 1;
	/*
	    @doc: https://tools.ietf.org/html/rfc4585#section-6.1
	        0                   1                   2                   3
	    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   |V=2|P|   FMT   |       PT      |          length               |
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   |                  SSRC of packet sender                        |
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   |                  SSRC of media source                         |
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   :            Feedback Control Information (FCI)                 :
	   :                                                               :
	    */
	    int32_t err = BPer_Ok;
	    if(!bPer_buffer_require(buffer,bPer_get_rtcpCommon_nb_bytes(comm))) {
		        return bPer_error_wrap(ERROR_RTC_RTCP, "requires %d bytes", bPer_get_rtcpCommon_nb_bytes(comm));
		    }

		    comm->header.length = 2;
		    if(BPer_Ok != (err = bPer_encode_header_rtcpCommon(comm,buffer))) {
		        return bPer_error_wrap(err, "encode header");
		    }

		    bPer_write_4bytes(buffer,comm->mediaSsrc);

	    return err;
}
int32_t bPer_decode_rtcpPli(BPerRtcpCommon* comm,BPerBuffer* buffer){
	if(comm==NULL||buffer==NULL) return 1;
	/*
	    @doc: https://tools.ietf.org/html/rfc4585#section-6.1
	        0                   1                   2                   3
	    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   |V=2|P|   FMT   |       PT      |          length               |
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   |                  SSRC of packet sender                        |
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   |                  SSRC of media source                         |
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   :            Feedback Control Information (FCI)                 :
	   :                                                               :
	   */

	    int32_t err = BPer_Ok;
	    comm->data = buffer->head;
	    comm->nb_data = bPer_buffer_left(buffer);

	    if(BPer_Ok != (err = bPer_decode_header_rtcpCommon(comm,buffer))) {
	        return bPer_error_wrap(err, "decode rtcp pli header");
	    }

	    comm->mediaSsrc = bPer_read_4bytes(buffer);
	    return err;
}
uint64_t bPer_rtcpPli_nb_bytes(BPerRtcpCommon* comm){
	return 12;
}

